package br.senai.sc.web.amostras.beans;

import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.senai.sc.controller.Parametro;
import br.senai.sc.controller.Qualidade;
import br.senai.sc.controller.crud.AmostraCRUD;
import br.senai.sc.controller.exception.BusinessException;
import br.senai.sc.model.Amostra;
import br.senai.sc.web.charts.QualidadeBarRenderer;

/**
 * Classe responsável pelas ações da página de impressão do relatório da
 * amostra.
 * 
 * @author Fernando Marquardt &lt;fernando.marquardt@sc.senai.br&gt;
 * @since 16/02/2012
 * @version $Id: AmostrasRelatorioBean.java 28 2012-03-07 20:48:20Z
 *          fernando.marquardt $
 */
@Named
@SessionScoped
public class AmostrasRelatorioBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Inject
	private AmostraCRUD amostraCRUD;

	private Integer idAmostra;

	private Amostra amostra;

	private StreamedContent graficoParametros;

	private StreamedContent graficoIQA;

	public void carregarAmostra() {
		amostra = amostraCRUD.findAmostra(idAmostra);

		criarGraficoParametros();
		criarGraficoIQA();
	}

	protected void criarGraficoParametros() {
		try {
			JFreeChart chart = ChartFactory.createBarChart3D("Notas",
					"Parâmetros", "Nota", criarDataset(),
					PlotOrientation.VERTICAL, false, true, false);
			chart.setBackgroundPaint(Color.WHITE);

			Parametro parametros[];
			parametros = amostra.getParametros();
			Qualidade[] qualidades = new Qualidade[parametros.length];
			for (int i = 0; i < parametros.length; i++) {

				qualidades[i] = Qualidade.getQualidade(parametros[i].getIqa());
			}

			QualidadeBarRenderer renderer = new QualidadeBarRenderer(qualidades);

			CategoryPlot categoryPlot = chart.getCategoryPlot();
			categoryPlot.getRangeAxis().setRange(0, 100);
			categoryPlot.setRenderer(renderer);
			categoryPlot.getDomainAxis().setCategoryLabelPositions(
					CategoryLabelPositions
							.createUpRotationLabelPositions(Math.PI / 4));

			File chartFile = new File("graficoAmostra");
			ChartUtilities.saveChartAsPNG(chartFile, chart, 600, 400);

			graficoParametros = new DefaultStreamedContent(new FileInputStream(
					chartFile), "image/png");
		} catch (Exception e) {
			// TODO tratar exceção de cálculo IQA
		}
	}

	protected void criarGraficoIQA() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();

		dataset.setValue(amostra.getIQA(), amostra.getPontoColeta().getNome(),
				"IQA");

		JFreeChart chart = ChartFactory.createBarChart3D("IQA", null, "Nota",
				dataset, PlotOrientation.VERTICAL, false, true, false);
		CategoryPlot categoryPlot = chart.getCategoryPlot();

		categoryPlot.setRenderer(new QualidadeBarRenderer(
				new Qualidade[] { amostra.getQualidade() }));
		categoryPlot.getRangeAxis().setRange(0, 100);

		try {
			File chartFile = new File("graficoIQA");
			ChartUtilities.saveChartAsPNG(chartFile, chart, 130, 290);
			graficoIQA = new DefaultStreamedContent(new FileInputStream(
					chartFile), "image/png");
		} catch (IOException e) {
			// TODO tratar exceção de cálculo IQA
		}
	}

	protected CategoryDataset criarDataset() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();

		try {
			String nomePontoColeta = amostra.getPontoColeta().getNome();
			for (Parametro parametro : amostra.getParametros()) {
				dataset.setValue(parametro.getIqa(), nomePontoColeta, parametro
						.getDescricao().getValor());
			}
		} catch (BusinessException e) {
			// TODO tratar exceção do cálculo de IQA
		}
		//
		// dataset.setValue(amostra.getNotaColiformesFecais(),
		// amostra.getPontoColeta().getNome(), "Coliformes fecais");
		// dataset.setValue(amostra.getNotaDBO(),
		// amostra.getPontoColeta().getNome(), "DBO");
		// dataset.setValue(amostra.getNotaPT(),
		// amostra.getPontoColeta().getNome(), "Fósforo total");
		// dataset.setValue(amostra.getNotaNT(),
		// amostra.getPontoColeta().getNome(), "Nitrogênio total kjeldhal");
		// dataset.setValue(amostra.getNotaOD(),
		// amostra.getPontoColeta().getNome(), "Oxigênio dissolvido");
		// dataset.setValue(amostra.getNotaPH(),
		// amostra.getPontoColeta().getNome(), "pH");
		// dataset.setValue(amostra.getNotaST(),
		// amostra.getPontoColeta().getNome(), "Sólidos totais");
		// dataset.setValue(amostra.getNotaTemperatura(),
		// amostra.getPontoColeta().getNome(), "Temperatura do líquido");
		// dataset.setValue(amostra.getNotaTurbidez(),
		// amostra.getPontoColeta().getNome(), "Turbidez");

		return dataset;
	}

	public Qualidade[] getQualidades() {
		return Qualidade.values();
	}

	public Integer getIdAmostra() {
		return idAmostra;
	}

	public void setIdAmostra(Integer idAmostra) {
		this.idAmostra = idAmostra;
	}

	public Amostra getAmostra() {
		return amostra;
	}

	public void setAmostra(Amostra amostra) {
		this.amostra = amostra;
	}

	public StreamedContent getGraficoParametros() {
		return graficoParametros;
	}

	public void setGraficoParametros(StreamedContent grafico) {
		graficoParametros = grafico;
	}

	public StreamedContent getGraficoIQA() {
		return graficoIQA;
	}

	public void setGraficoIQA(StreamedContent graficoIQA) {
		this.graficoIQA = graficoIQA;
	}
}